//
//  WeiboStatusListViewModel.swift
//  WinsonWeibo
//
//  Created by Administrator on 2017/4/18.
//  Copyright © 2017年 Winson. All rights reserved.
//

import Foundation

/// 微博数据列表视图模型
/*
父类的选择
 
    - 如果类需要使用 ‘KVC’ 或者字典转模型框架设置对象值，类就需要继承自 NSObject
    - 如果类只是包装一些代码逻辑（写了一些函数），可以不用任何父类，好处：更加轻量级
    - 提示：如果用 OC 写，一律继承自 NSObject 即可
 
 本类的使命：负责微博的数据处理
 1. 字典转模型
 2. 上拉 ／ 下拉 刷新数据处理
 */

/// 上拉刷新错误的总次数
fileprivate var pullupTryTimes = 3

class WeiboStatusListViewModel {

    /// 计数上拉刷新错误的次数
    fileprivate var pullupErrorTime = 0
    /// 微博数据模型懒加载
    lazy var statusList = [WBStatus]()

    /// 加载微博模型数据
    ///
    /// - Parameters:
    ///   - isPullUp: 是否是上拉刷新
    /// - Parameter completion: 完成回调
    func loadStatus(isPullUp: Bool, completion: @escaping (_ isSuccess: Bool, _ shouldRefresh: Bool)->()) {

        if isPullUp && (pullupErrorTime > pullupTryTimes) {
            return completion(false, false)
        }
        // since_id 只返回最新的微博
        let since_id = isPullUp ? 0 : (statusList.first?.id ?? 0)
        let max_id = !isPullUp ? 0 : (statusList.last?.id ?? 0)

        WBNetworkManager.shared.statusList(since_id: since_id, max_id: max_id) { (list, isSuccess) in

            // 1. 字典转模型
            guard let array = NSArray.yy_modelArray(with: WBStatus.self, json: list ?? []) as? [WBStatus] else {
                // 解析失败
                completion(isSuccess, false)
                return
            }
            // 2. 拼接数据
            if isPullUp {
                self.statusList += array

            } else {
                // 下拉刷新
                self.statusList = array + self.statusList

            }
            // 3. 判断上下拉刷新的数据
            if array.count == 0 && isPullUp {

                self.pullupErrorTime += 1

                // 解析成功
                completion(isSuccess, false)
            }  else {

                completion(isSuccess, true)
            }
        }
    }
}
